import { ControlOptions, NzFormlyFieldConfig } from '../formly-utils';
import { TemplateRef } from '@angular/core';
import { NzSafeAny, NzSizeLDSType } from 'ng-zorro-antd/core/types';
import {
  NzTabComponent,
  NzTabPosition,
  NzTabsCanDeactivateFn,
  NzTabType,
  TabTemplateContext
} from 'ng-zorro-antd/tabs';

/**
 * Tabs模板配置
 */
export interface TabsOptions<T = NzSafeAny> extends ControlOptions {
  /**
   * 当前激活 tab 面板的 序列号，可双向绑定
   */
  nzSelectedIndex?: number;
  /**
   * 是否使用动画切换 Tabs，在 nzTabPosition="top" | "bottom" 时有效
   */
  nzAnimated?: boolean | { inkBar: boolean; tabPane: boolean };
  /**
   * 大小，提供 large default 和 small 三种大小
   */
  nzSize?: NzSizeLDSType;
  /**
   * tab bar 上额外的元素
   */
  nzTabBarExtraContent?: TemplateRef<void>;
  nzTabBarExtraContentName?: string;
  /**
   * tab bar 的样式对象
   */
  nzTabBarStyle?: Record<string, string> | null;
  /**
   * 页签位置，可选值有 top right bottom left
   */
  nzTabPosition?: NzTabPosition;
  /**
   * 页签的基本样式
   */
  nzType?: NzTabType;
  /**
   * tabs 之间的间隙
   */
  nzTabBarGutter?: number;
  /**
   * 是否隐藏所有tab内容
   */
  nzHideAll?: boolean;
  /**
   * 与 Angular 路由联动
   */
  nzLinkRouter?: boolean;
  /**
   * 以严格匹配模式确定联动的路由
   */
  nzLinkExact?: boolean;
  /**
   * 决定一个 tab 是否可以被切换
   */
  nzCanDeactivate?: NzTabsCanDeactivateFn;
  /**
   * 标签居中展示
   */
  nzCentered?: boolean;
  /**
   * 当前激活 tab 面板的 序列号变更回调函数
   */
  nzSelectedIndexChange?: (evt: number, field: TabsFieldConfig, instance: NzTabComponent) => void;
  /**
   * 当前激活 tab 面板变更回调函数
   */
  nzSelectChange?: (
    evt: { index: number; tab: NzTabComponent },
    field: TabsFieldConfig,
    instance: NzTabComponent
  ) => void;

  /**
   * 每个tab配置
   */
  tabs?: TabsItem[];
}

export interface TabsItem extends TabItemOption {
  /**
   * tab内容
   */
  nzxContent?: string | TemplateRef<{ $implicit: TabsItem; field: TabsFieldConfig }>;
  /**
   * tab内容模板名称
   */
  nzxContentName?: string;
}

export interface TabItemOption extends ControlOptions {
  /**
   * 选项卡头显示文字
   */
  nzTitle?: string | TemplateRef<TabTemplateContext>;
  nzTitleName?: string;
  /**
   * 被隐藏时是否渲染 DOM 结构
   */
  nzForceRender?: boolean;
  /**
   * 是否禁用
   */
  nzDisabled?: boolean;
  /**
   * 单击 title 的回调函数
   */
  nzClick?: (field: TabsItemConfig, instance: NzTabComponent) => void;
  /**
   * 右键 title 的回调函数
   */
  nzContextmenu?: (evt: MouseEvent, field: TabsItemConfig, instance: NzTabComponent) => void;
  /**
   * tab 被选中的回调函数
   */
  nzSelect?: (field: TabsItemConfig, instance: NzTabComponent) => void;
  /**
   * tab 被取消选中的回调函数
   */
  nzDeselect?: (field: TabsItemConfig, instance: NzTabComponent) => void;
}

export type TabsItemConfig = { tab?: TabItemOption } & ControlOptions;

/**
 * Tabs配置
 */
export interface TabsFieldConfig extends NzFormlyFieldConfig<TabsOptions> {
  type: 'tabs';
  fieldGroup?: NzFormlyFieldConfig<TabsItemConfig>[];
}
